Kapitel 6 enth{lt die komplette Erl{uterung des geoLinker, inklusive geoLinker Kommando-File. Sie sollten das Kapitel zuerst komplett durchlesen. Informationen wie man geoLinker vom Desktop aus benutzt finden sie im Kapitel 4 "running geoLinker".
@Der Link Proze~
geoAssembler generiert .rel (verschiebare Object) Files die aus drei Hauptelementen bestehen:
o verschiebbaren 6502 Maschinencode
o nicht aufgel|ste Ausdr}cke
o globale Labels und Wertzuweisungen
geoLinker nimmt ein oder mehrere Files und konvertiert sie zu einer ablauff{higen Anwendung.
Wenn geoAssembler auf ein undefiniertes Symbol trifft, ein Symbol das im laufenden Quellfile noch nicht definiert wurde, wird ein externes Symbol unterstellt. G}ltige Ausdr}cke die externe Symbole benutzen werden dem geoLinker zum Aufl|sen }bergeben.
Wenn sie mehrere .rel Files zusammen linken, }bergibt geoLinker externe Verweise von einem File mit globalen Symbolen in anderen Files, dabei werden alle erlaubten Querverweise aufgel|st.
Im Link-Proze~ etabliert geoLinker ebenfalls festgelegte absolute Adressen f}r den Programm-Code-Bereich (.
@psect
) und nicht initialisierte Space-Bereiche (.
@ramsect
). Dann wird aller aufl|sbarer Maschinencode in absoluten Maschinencode umgewandelt, der unter GEOS ablauff{hig ist.
Wenn geoLinker in der Lage ist alle externen Verweise aufzul|sen, erstellt er ein lauff{higes Anwendungs-File, komplett mit einem ordentlichen GEOS Header Block, einer .dbg Symboltabelle die unter dem geoDebugger benutzt werden kann und einer optionalen .sym sichtbaren Symboltabelle.
HLinker ]berblick
Command File
geoLinker ben|tigt viele Informationen um mehrere .rel Files in eine GEOS Anwendung umzuwandeln. Neben den verkn}pfbaren (linkable) Modulen die sie festlegen, k|nnen sie einen Ausgabe Filenamen, einen nutzbaren GEOS Header, absolute psect und ramsect Adressen, sogar nachladbare VLIR-Module k|nnen sie anlegen. Alle diese Informationen werden in einem 'linker command files' festgelegt. geoAssembler Quellfiles, werden wie 'linker command files' unter GEOS entwickelt.
@Sequentielle und Vlir Anwendungen
geoLinker kann sowohl sequentielle als auch VLIR-Anwendungen entwickeln. Sequentielle Anwendungen bestehen aus einem zusammenh{ngenden Hauptmodul, welches beim Starten komplett in den Speicher geladen wird. Vlir (Index-Datei mit variabler L{nge) Anwendungen bestehen aus einem Modul das sich im Speicher befindet, einem sequentiellen File sehr {hnlich, welches geladen wird, wenn sie die Anwendung starten und mehreren nachladbaren Modulen. Modulen die bei Bedarf in den Speicher geladen werden.
@Standard Commodore Anwendung
geoLinker kann, mit der
@.cbm
Anweisung, auch 'standard commodore Anwendungen' verarbeiten die ohne GEOS lauff{hig sind. Eine 'standard commodore Anwendung' ist genauso, wie eine sequentielle GEOS Anwendung aufgebaut, nur ohne File-Header. Weiter Informationen }ber 'standard commodore Anwendung' finden sie im 'Commodore 64 Programmers Reference Guide'.
@Header und Ausgabe File
Mit geoLinker k|nnen sie einen GEOS File Header erstellen und ein Ausgabe-File im 'Linker Kommando File'. Wenn sie nur eines oder keines erstellen, verwendet geoLinker einen Vorgabewert. Der Vorgabe Header benutzt ein festgelegtes Test Icon mit Lade- und Startadresse die auf das erste Byte im psect Bereich zeigt. Der vorgegebene Filename ist
@test.
Psect und Ramsect Adressen
Alle psect und die meisten ramsect Bereiche sind verschiebbar - ihnen werden absolute Adressen im Commodore-Speicher beim linken zugewiesen. Wenn sie keine psect Adresse festlegen setzt geoLinker den Vorgabewert $400 ein. Legen sie keine spezielle ramsect Adresse fest, f}gt geoLinker den ramsect Bereich nach dem letzten Byte ihres psect Bereichs ein (oder Modul bei einer Vlir Anwendung).
@Linker Kommando File
Jede Linkoperation mu~ ein 'linker command file' benutzen. 'linker command files' werden unter geoWrite erstellt und entsprechen geoAssembler Quellfiles - sie bestehen aus Linkeranweisungen, Filenamen und Kommentaren.
geoWrite nutzen zum Erstellen von 'linker command file'
geoLinker 'command files' m}ssen im geoWrite Format sein. Sie erstellen sie genauso, wie sie geoAssembler Quellcode erstellen. Mehr Informationen }ber die Anwendung von geoWrite finden sie im kapitel 4 'Creating geoAssembler Source Code' und im geoWrite Kapitel ihres GEOS User's Guide.
Achtung: Ein 'linker command file' darf max. eine geoWrite Seite lang sein. Jeder dar}ber hinausgehende Text wird }berlesen.
Kommentare
Wie in geoAssembler, k|nnen sie in ihrem 'linker command file', Kommentare mit einem Semikolon (;) einf}gen. geoLinker }berliest den Text vom Semikolon bis zum Zeilenende. Ist das Semikolon nicht das erste Zeichen in der Zeile, mu~ wenigstens ein Leerzeichen vorangestellt werden.
Anweisungen
geoLinker beinhaltet einige Anweisungen mit deren Hilfe k|nnen sie einige Funktionen kontorllieren und ausw{hlen:
.output bestimmt output Filename
.header bestimmt header .rel Filename
.psect legt absolute psect Adresse fest
.ramsect legt absolute ramsect Adresse fest
.seq sequentieller Anwendungs-Linker
.vlir VLIR Anwendungs-Linker
.mod Beginn des VLIR Nachlade-Files
Standard Commodore
Anwendungs-Linker
Linkeranweisungen unterscheiden nicht zwischen Gro~- und Kleinschreibung. Sie k|nnen sie in Gro~- oder Kleinbuchstaben oder gemischt eintippen.
Filenamen
Wenn ein Element oder eine Zeile, weder ein Kommentar noch eine Anweisung ist, bewertet geoLinker es als .rel verschiebbares Objekt-File. Linkbare Files werden durch folgende Anweisungen in den Zeilen gekennzeichnet,
@.seq, .vlir, .mod,
oder
@.cbm.
Sie ben|tigen keine bestimmte Syntax, es ist jedoch nur ein Filename je Zeile erlaubt ist. Bei Filenamen wird zwischen Gro~- und Kleinschreibung unterschieden.
Wenn sie zwei Floppies haben (eine kann eine REU sein), sucht geoLinker auf beiden nach dem gew}nschten File, er beginnt dabei mit der Floppy auf der sich das 'linker comand file' befindet.
@Ausdr}cke
geoLinker benutzt denselben Editor wie geoAssembler. Dadurch k|nnen sie in ihrem 'linker comand file' dieselben Ausdrucks-Arten verwenden, wie in ihrem Assembler Quellcode. Sie k|nnen sogar Ausdr}cke verwenden, die Symbolzuweisungen im Assembler-File enthalten.
zum Beipiel wollen sie anstatt
@.ramsect $4100
lieber folgenden Ausdruck benutzen
@.ramsect buffer-start+100
Dies ist erlaubt, vorausgesetzt, sie weisen
@buffer-start
in einem der .rel Files einen Wert zu. Mehr Informationen }ber den Editor finden sie im Kapitel 5 unter 'Expressions'.
@Sequentielle Anwendung Linker
Eine sequentielle Anwendung benutzt ein 'linker command file' das nach folgendem Basismuster aufgebaut ist:
(siehe Kapitel 6-4)
Pfilename
frei w{hlbarer Name und
Paddrexp
ist ein Ausduck dem beim Auswerten eine absolute Adresse im Commodore Speicher zugewiesen wird. Die meisten Ausdr}cke sind optional, dies wird durch die eckigen Klammern angezeigt. Das einfachste 'linker command file', das alle Vorgaben benutzt, sieht so aus:
@.seq
Pfilename
@.rel
Damit wird ein .rel File in eine sequentielle Anwendung gelinkt. Es werden der Vorgabe Header, die Vorgabe Adressen und der vorgegebene Filename benutzt. Es folgt ein Beispiel f}r ein umfangreiches sequentielles Quellfile:
(Seite 6-5)
Dieses 'linker command file' generiert eine sequentielle Anwendung die
@myprogrammm
genannt wird, den Header
@myheader.rel
benutzt und die Files
@myinit.rel, mymain.rel, mydata.rel
@ mytable.rel
assembliert. Die .rel Files werden verschoben und miteinander verbunden, eines nach dem anderen, in der Reihenfolge wie sie im 'linker command file' aufgef}hrt sind. Das Programm enth{lt eine absolute Adresse bei
@prg-addr$42E
@prg-addr
mu~ in einem der .rel Files einen Wert zugwiesen bekommen) und die absloute ramsect Adresse $3000.
@VLIR- und LinkAnwendung
Eine VLIR-Anwendung ben|tigt ein umfangreiches 'linker command file', um die nachlabaren Module zu verwalten. Das 'linker command file' f}r eine Vlir Anwendung hat folgendes Muster:
Beispiel:
(Seite 6-5)
Obwohl ein VLIR 'linker command file' einem sequentiellen 'linker command file' gleicht, werden sie gleich die zus{tzliche .
Nachlade-Modul Anweisung bemerken. Es hilft ihnen wenn sie sich bei einer VLIR-Anwendung eine Reihe von sequentiellen Files vorstellen die, die zu einem Programm-File zusammengef}gt werden. Dem residenten (im Speicher befindlichen) Hauptmodul folgt die .
@vlir
Anweisung. Sie kann ihren eigenen .
@psect
und .
@ramsect
haben und besteht aus einem oder mehreren .rel Files. Jedes Nachlade-Modul hat seinen eigenen .
@psect
und .
@ramsect,
zus{tzlich zu seinem .rel Files Teil.
Beispiel:
(Seite 6-6)
Dieses 'linker command file' generiert eine VLIR-Anwendung mit Namen
@myvlir
, die den Header
@vlirhead.rel
benutzt. Das residente Modul besteht aus 3 Files
@init.rel, dispatch.rel
und
@menus.rel
. Au~erdem gibt es drei Nachlade-Module, mit den Nummern 1 bis 3, jedes mit einer seiner eigenen absoluten Adresse.
@Aufl|sung
@von Querverweisen
geoLinker hat einige bestimmte Eigenschaften und bestimmte Begrenzungen, die auf die Art der Aufl|sung der Querverweise Einflu~ nehmen.
@wie geoLinker Querverweise aufl|st
Assemblieren sie ein File, unterstellt geoAssembler, da~ undefinierte Symbole eines Ausdrucks einen externen Hinweis darstellen und sendet den ganzen, nicht ausgewerteten Ausdruck, an das .rel File. geoLinker versucht dann diesen Ausdruck mit Hilfe der globalen Symbole der anderen .rel Files auszuwerten.
@Probleme mit globalen Labels
Oft benutzen zwei oder mehr .rel Files f}r Labels und Wortzuweisungen, die keine Beziehung zueinander haben, die gleichen Symbole. Beim Linken dieser Files, trifft geoLinker auf diese problematischen Symbole. Im Idealfall hat der Programmierer vorgesorgt, indem er diese Symbole vom Linken durch .
@noglbl
und .
@noeqin
Anweisungen ausgeschlossen hat. Dies ist in der Praxis jedoch selten der Fall. Das Ergebnis ist, da~ beim Linken dauernd neue Werte f}r das globale Label auftauchen. geoLinker, jedoch, zeigt dies nicht als Error f}r Mehrfachzuweisungen an Labels an und unterstellt, da~ dies unbeabsichtigt war, bis ein anderes .rel File auf eines dieser externen Symbole verweist, in diesem Fall wei~ geoLinker nicht welches gemeint ist. Ein Error wird generiert.
Achtung
: Wenn ein Symbol beim Assemblieren aufgel|st werden kann, bleibt es dabei, es wird dann kein externer Verweis generiert. Deshalb hat eine interne Routine eines Objekt-Modules Vorrang, vor einer Routine mit demselben Namen, die aber extern ist.
@VLIR Nachlade-Modul Verweise
Ein VLIR-File hat }blicherweise ein residentes Modul und mehrere Nachlade-Module. geoLinker linkt jedes Modul (ob resident oder nachladbar), als ob es ein vollkommen unabh{ngiges sequentielles File w{re, mit einer Ausnahme: ein Nachlade-Modul verweist auf Symbole im residenten Modul. Das residente Modul kann jedoch nicht auf Symbole im Nachlade Modul zugreifen und ein Nachlade Modul kann nicht auf Symbole in anderen Nachlade Modulen zugreifen.
Das scheint dem Sinn eines Nachlade-Linkers zu widersprechen. Gl}cklicherweise kann die Begrenzung des Geltungsbereichs von Symbolen }berwunden werden, indem man Sprungtabellen benutzt. Eine VLIR-Sprungtabelle kann am Beginn jedes Nachlade-Moduls eingebaut werden, und dann verwendet man ein Festwerte-File, das in diese Sprungtabelle zeigt. So arbeitet Berkeley Softworks mit Nachlade-Modulen in ihren VLIR-Anwendung. (Das Beispiel f}r eine Nachlade Sprungtabelle, finden sie als sample Vlir Anwendung auf ihrer geoProgrammer Diskette.)
Zweck: legt den Namen eines Output-Files f}r eine Anwendung fest und einen Basis-File-Name f}r seine
.sym, .dbg und .err Files
Anwendung:
@.output
Pfilename
Beachten sie:
Pfilename
ist ein wahlfreier zul{ssiger Name
@.output
Anweisung erlaubt ihnen einen Output-File-Namen festzulegen, in irgendeinem File, das geoLinker beim aktuellen Linkervorgang generiert. Wenn sie keine
@.output
Anweisung verwenden, benutzt geoLinker den Namen
@test
. Sie sollten im Filenamen keine Anh{ngsel verwenden, geoLinker f}gt ein zugeh|riges .sym, .dbg oder .err an.
@.output
File, falls benutzt, mu~ die erste Anweisung im 'linker command file' sein.
Beispiel:
@.output myapp
Dies zeigt geoLinker an, da~ es den Namen
@myapp
als Namen f}r die gelinkten Anwendung zu benutzen hat und als Basic-File-Name f}r alle angeschlossenen Files (
@myapp.sym, myapp.dbg, myapp.err).
Anweisung:
@.header
Zweck: veranla~t, da~ ein vorher assembliertes .rel File benutzt wird, um einen Geos File Header zu
generieren
Anwendung:
@.header
Pfilename
Beachten sie:
Pfilename
ist ein wahlfreier zul{ssiger Name
Das Header File mu~ genau 256 Bytes lang sein. Wenn sie den Header mit der header Anweisung entwicklen, werden immer 256 Bytes generiert. Ansonsten m}ssen sie selbst daf}r sorgen, da~ 256 Bytes verwendet werden. Wenn das Header File mehr oder weniger als 256 Bytes enth{lt, wird ein Fehler genriert.
Wenn sie die .
@header
Anweisung weglassen, wird ein Vorgabe-Header mit den dazugeh|rigen sequentiellen oder Vlir Kennzeichen generiert. Der Vorgabe-Header benutzt eine Lade- und Startadresse die auf das erste Byte des Psect-Speichers (residentes Modul) ihres Codes zeigt. Der Vorgabe-Header kann nicht zum generieren von Desk Hilfsprogrammen benutzt werden.
Die .
@header
Anweisung mu~ nach jeder .
@output
Anweisung erscheinen, aber vor der .
oder .
@vlir
Anweisung. Vor der .
Anweisung ist
@header
falsch.
Beispiel:
@header seqhead.rel
Das zeigt dem geoLinker an, da~ er die Data's des
@ seqhead.rel
f}r den aP's GEOS File Header benutzen mu~.
Weitere Informationen }ber GEOS File Header finden sie unter 'Header Directives' im kapitel 5 dieses Handbuches. Verwenden sie auch den
PThe Official GEOS Programmer's Refernce Guide
Anweisung:
@.psect
Zweck: erstellt eine absolute Adresse f}r den Programmcode und Databereich (psect)
Anwendung:
@.psect
Paddrexp
Beachten sie:
Paddrexp
ist ein Ausdruck der in eine absolute Adresse umgewandelt wird
geoLinker l|st keine absoluten Adressen des Psect Bereichs bis zum Linken auf. Aus diesem Grund k|nnen sie die .
@psect
Link Anweisung verwenden um absolute Adressen f}r ihren Programmcode und Databereiche festzulegen. Wenn sie die .
@psect
Anweisung weglassen, benutzt geoLinker den Vorgabewert $400.
Die .psect Anweisung darf nur nach .
@vlir
oder .
weggelassen werden und sie mu~ vor dem zugeh|rigen .rel Filenamen erkl{rt werden. Beim Vlir linken, beeinflu~t .psect nur das zuletzt bearbeitete resediente oder nachladbare Modul.
Beispiel:
(Seite 6-10)
Anweisung:
@.ramsect
Zweck: erstellt eine absolute Adresse f}r relative nicht initialisierte Databereiche (ramsect)
Anwendung:
@.ramsect
Paddrexp
Beachten sie:
Paddrexp
ist ein Ausdruck der in eine absolute Adresse umgewandelt wird
Wenn sie wollen, k|nnen sie geoLinker die absolute Adresse ihres Ramsect Bereichs aufl|sen lassen, indem sie keine absolute Adresse in ihrer geoAssembler .
@ramsect
Anweisung festlegen. Sie k|nnen die geoLinker .
@ramsect
Anweisung benutzen um eine absolute Adresse f}r diese Ramsect Bereiche festzulegen. Wenn sie die .
@ramsect
Anweisung weglassen, f}gt geoLinker ihren Ramsect Bereich automatisch unmittelbar an das Ende des Psect Bereichs an. Wenn ein Vlir Nachlade-Modul kein .
@ramsect
hat, wird der Ramsect Bereich an den Psect Bereich des Nachlade-Moduls angeh{ngt, nicht an die residenten Module.
Die .
@ramsect
Anweisung kann nach den
@.seq, .vlir, .mod
oder .
Anweisungen wegelassen werden. Alle relativen Adressen des Ramsect Bereichs in diesen Modulen werden auf der Basis dieser Adressen erg{nzt und aufgel|st.
Beispiel:
(Seite 6-11)
Anweisung:
@.seq
Zweck: zeigt geoLinker an da~ dies ein seqentielles File ist und da~ alle folgenden Filenamen in ein residentes Hauptfile gelinkt werden sollen
Anwendung:
@.seq
Beachten sie: ben|tigt keine Parameter
Wenn sie eine sequentielle File Anwendung generieren wollen mu~ diese Anweisung vor die .
@psect
@ramsect
oder linkbaren Files gesetzt werden. geoLinker erstellt dann eine sequentielle Anwendung.
Ein 'linker command file' mu~ schlie~lich eine
@.seq, .vlir
oder .
Anweisung beinhalten, mehr nicht. Die einzigen Anweisungen die vor .
gesetzt werden d}rfen sind .
@output
und .
@header
. Die .
Anweisung darf in Verbindung mit .
nicht benutzt werden.
Wenn die .
@header
Anweisung weggelassen wird, generiert geoLinker einen sequentiellen Vorgabe Header.
Beispiel:
(Seite 6-12)
Anweisung:
@.vlir
Zweck: zeigt geoLinker an, da~ dies eine VLIR (Indexdatei mit variabler L{nge) Anwendung ist und da~ der
folgende Teil (bis zur .mod Anweisung) ein residentes Modul ist
Anwendung:
@.vlir
Beachten sie: ben|tigt keine Parameter
Wenn sie eine VLIR Anwendung generieren wollen, m}ssen sie die Anweisung vor
@.psect
@.ramsect
@.mod
oder linkbaren Filenamen plazieren. Sie zeigt geoLinker an da~ eine VLIR Anwendung generiert werden mu~.
@.psect
und
@.ramsect
Anweisungen f}r die residenten Module m}ssen vor den .rel Filenamen stehen.
@.psect
und
@.ramsect
Anweisungen die einer
@.vlir
Anweisung unmittelbar folgen, beeinflussen keine Nachlade-Module, die mit der
@.mod
Anweisung erstellt wurden.
(Seite 6-13)
Anweisung:
@.mod
Zweck: Beginn eines Nachlade-Modules
Anwendung:
@.mod
Beachten Sie:
ist ein Ausdruck der in eine Zahl zwischen 1 und 126 umgewandelt wird
VLIR-Anwendungen haben ein residentes Modul und bis zu 20 Nachlade-Module. Mit der .
@mod
Anweisung, gefolgt von einer .rel Modul-Nummer (1 bis 126), weisen sie geoLinker an ein neues Nachlade-Modul zu beginnen. Die Modul-Nummer wird die Record-Nummer im Vlir File. Denken sie daran, da~ laden und }berlagern von Nachlade-Modulen eine Funktion ihres Programmes ist; die .
Anweisung erlaubt ihnen lediglich eine Gruppe von .rel Files zusammen in ein Vlir Record aufzul|sen.
Am Anfang eines Nachlade-Modules, werden die psect und ramsect Z{hler auf ihre Vorgabewerte zur}ckgesetzt. Wenn sie eine .
@psect
Anweisung benutzen, mu~ sie hinter der .
Anweisung stehen, aber vor den .rel Files. Wenn .
@psect
nicht festgelegt wird, }bernimmt geoLinker den Vorgabewert $400; wenn kein .ramsect festgelegt wird, wird der Ramsect Bereich unmittelbar hinter dem letzten Psect Byte des Nachlade-Modules angeh{ngt.
Beachten sie: Sie k|nnen die Modul-Nummer selbst bestimmen. Sie m}ssen nicht mit 1 beginnen und m}ssen nicht fortlaufend durch- nummerieren. Die einzige Einschr{nkung : die Gesamtzahl der Module 20 nicht }berschreiten darf.
(Seite 6-14)
(Seite 6-15)
Das obige Beispiel generiert eine VLIR-Anwendung mit einem residenten Modul und zwei Nachlade-Modulen, dabei werden alle Vorgabewerte benutzt.
Mehr Informationen }ber die Entwicklung ihrer eigenen Nachlade-Bearbeitungs-Routinen, finden sie in der
sample
VLIR-Anwendung auf ihrer geoProgrammer Diskette.
Anweisung:
@.cbm
Zweck: zeigt geoLinker an, da~ dies eine Standard Commodore Anwendung ist, d.h. alle folgenden Files
werden in ein residentes Hauptfile gelinkt
Anwendung:
@.cbm
Beachten sie: ben|tigt keine Parameter
Wollen sie eine Standard-Commodore-Anwendung generieren wollen, mu~ diese Anweisung vor die .
@psect
@ramsect
oder linkbaren Files gesetzt werden. Sie weist geoLinker an, eine Anwendung zu entwicklen, die anderen Files die von Assemblern entwickelt wurden gleich ist. Eine Standard Commodore Anwendung kann nicht vom GEOS Desktop aus gestartet werden.
Ein 'linker command file' mu~ wenigstens eine
@.seq, .vlir
oder .
Anweisung haben, aber mehr nicht. Die einzigen Anweisungen die vor .
gesetzt werden d}rfen sind .
@output
und .
@header
. Die .
Anweisung darf in Verbindung mit .
nicht benutzt werden.
geoLinker generiert f}r die Anwendung keinen GEOS File-Header. Wenn sie die Header-Anweisung verwenden wird ein Fehler generiert. Das Icon das am Destop angezeigt wird, zeigt das
ErkennungsIcon. Wollen sie die Anwendung auch von Desktop starten, k|nnen sie sie mit dem Icon Editor (enthalten im DESK PACK1) ins GEOS-Format konvertieren. Dadurch kann vom Desktop aus auf das File zugegriffen werden, obwohl es dadurch keine GEOS Anwendung wird.